package sn.gandal.agriculture.agrimobile.j2me.dao;

import java.io.IOException;
import java.util.Vector;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import sn.gandal.agriculture.agrimobile.j2me.businessObjects.Membre;


/**
 *
 * @author dysow
 *
 */
public class AbonneDAO
{

    private RecordStore rsAbonnes;
    private static String TABLE_ABONNE = "abonne";
    private boolean valide = false;

    public void ajouter(Membre abonne) throws RecordStoreException, IOException
    {
	RecordStore rs;

	rs = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	byte[] bytes = abonne.serialize();
	rs.addRecord(bytes, 0, bytes.length);

	rs.closeRecordStore();
    }

    /**
     * M�thode pour modifier un abonn�
     * @throws RecordStoreException
     * @throws IOException
     */
    public void modifier(Membre abonne) throws RecordStoreException, IOException
    {
	int idRecord = -1;

	rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);
	abonne.setModified(true);
	byte[] donnes = abonne.serialize();

	idRecord = this.getIdFromAbonneId(abonne.getIdAbonne());

	this.rsAbonnes.setRecord(idRecord, donnes, 0, donnes.length);

	this.rsAbonnes.closeRecordStore();
    }

    /**
     * M�thode pour supprimer un abonn�
     * @throws RecordStoreException
     */
//    public void supprimer(Membre abonne) throws RecordStoreException
//    {
//	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);
//
//	this.rsAbonnes.deleteRecord(abonne.getIdRecord());
//
//	this.rsAbonnes.closeRecordStore();
//    }

    /**
     * Retourne la liste complete de tous les abonn� pr�sents dans la base
     * @return abonnes - Membre []
     */
    public Membre[] getAbonnes() throws RecordStoreException, IOException
    {
	Membre[] abonnes;
	RecordEnumeration re, ids;

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = rsAbonnes.enumerateRecords(null, null, false);

	abonnes = new Membre[this.rsAbonnes.getNumRecords()];
	byte[] record;
	int i = 0;
	while (re.hasNextElement())
	{
	    record = re.nextRecord();
	    Membre courant = new Membre();
	    courant.setIdRecord(re.nextRecordId());

	    courant.deSerialize(record);
	    abonnes[i] = courant;
	    i++;
	}

	re.destroy();
	rsAbonnes.closeRecordStore();
	return abonnes;
    }

    /**
     * Retourne la liste complete de tous les abonn� pr�sents dans la base
     * @return abonnes - Membre []
     */
    public Membre[] getAbonnes(String idAbonne, String nomMere, String nom, String prenom) throws RecordStoreException, IOException
    {
	Membre[] abonnes;
	RecordEnumeration re, ids;

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = rsAbonnes.enumerateRecords(null, null, false);

	//abonnes = new Membre[this.rsAbonnes.getNumRecords()];
	abonnes = new Membre[re.numRecords()];
	//byte[] record;
	int i = 0;
	while (re.hasNextElement())
	{
//	    record = re.nextRecord();
//	    Membre courant = new Membre();
//	    courant.setIdRecord(re.nextRecordId());
//	    courant.deSerialize(record);
//	    abonnes[i] = courant;
//	    i++;

	    int idRecord = re.nextRecordId();
	    System.out.println("IdRecord trouvé : " + idRecord);
	    byte[] record = new byte[rsAbonnes.getRecordSize(idRecord)];
	    //Récuperer la ligne à partir de la liste du recordStore
	    record = rsAbonnes.getRecord(idRecord);
	    Membre courant = new Membre();
	    courant.setIdRecord(idRecord);

	    courant.deSerialize(record);
	    //abonnes.addElement(courant);
	    abonnes[i] = courant;
	    i++;

	}

	re.destroy();
	rsAbonnes.closeRecordStore();
	return abonnes;
    }

//    public void deleteRecordStore() throws RecordStoreException
//    {
//	//RecordStore.listRecordStores();
//	RecordStore.deleteRecordStore(AbonneDAO.TABLE_ABONNE);
//    }
    public void deleteRecordStore()
    {

	try
	{
	    RecordStore.deleteRecordStore(AbonneDAO.TABLE_ABONNE);
	}
	catch (RecordStoreException ex)
	{

	    System.out.println("ADP connecté");
	}
    }

    public boolean abonneIdExiste(String abonneId) throws RecordStoreException
    {
	boolean ret = false;
	int abonneIdInt = Integer.parseInt(abonneId);

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	Membre abonne = new Membre();
	abonne.setIdAbonne(abonneIdInt);

	RecordEnumeration re = this.rsAbonnes.enumerateRecords(null, null, false);

	if (re.numRecords() > 0)
	{
	    ret = true;
	}

	re.destroy();
	this.rsAbonnes.closeRecordStore();

	return ret;
    }

    public Membre[] getRechercheAbonneList(int abonneId, String prenom, String nom) throws RecordStoreException, IOException
    {
	Membre[] abonneArray = null;
	RecordEnumeration re, ids;

	AbonneRecordFilter abonneRecordFilter = new AbonneRecordFilter();
	abonneRecordFilter.setAbonneId(abonneId);
	abonneRecordFilter.setPrenomAbonne(prenom);
	abonneRecordFilter.setNomAbonne(nom);
	abonneRecordFilter.setActif(true);

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = this.rsAbonnes.enumerateRecords(abonneRecordFilter, null, false);

	abonneArray = new Membre[re.numRecords()];
	int i = 0;
	while (re.hasNextElement())
	{
	    Membre courant = new Membre();
	    int id = re.nextRecordId();
	    System.out.println("IdRecord trouvé du recherche : " + id);
	    byte[] record = new byte[rsAbonnes.getRecordSize(id)];
	    //Récuperer la ligne à partir de la liste du recordStore
	    record = rsAbonnes.getRecord(id);
	    courant.setIdRecord(id);
	    courant.deSerialize(record);
	    abonneArray[i] = courant;
	    i++;
	}

	//re.destroy();
	rsAbonnes.closeRecordStore();
	return abonneArray;
    }

    /**
     * Editer  un enregistrement
     * @param id
     * @param record
     * @throws RecordStoreException
     */
    protected void editRecord(int id, String record) throws RecordStoreException
    {
	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	if (this.rsAbonnes != null)
	{
	    byte[] data = record.getBytes();

	    this.rsAbonnes.setRecord(id, data, 0, data.length);
	}

	this.rsAbonnes.closeRecordStore();
    }

    /**
     * Obtient l'ID généré automatiquement par le système
     * @param abonneId
     * @return
     * @throws RecordStoreException
     */
    protected int getIdFromAbonneId(int abonneId) throws RecordStoreException
    {
	int id = -1;

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	AbonneRecordFilter abonneRecordFilter = new AbonneRecordFilter();
	abonneRecordFilter.setAbonneId(abonneId);

	RecordEnumeration re = this.rsAbonnes.enumerateRecords(abonneRecordFilter, null, false);

	if (re.hasNextElement())
	{
	    id = re.nextRecordId();

	}

	this.rsAbonnes.closeRecordStore();

	return id;
    }

    public void supprimer(int abonneIdInt) throws RecordStoreException
    {
	int id = this.getIdFromAbonneId(abonneIdInt);

	rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	this.rsAbonnes.deleteRecord(id);
	this.rsAbonnes.closeRecordStore();
    }

    public void reinitialiserAbonneList(Vector vecAbonneList) throws RecordStoreException, IOException
    {
	try
	{
	    boolean recordStoreExist = UtilitiesDAO.recordStoreExist(AbonneDAO.TABLE_ABONNE);

	    if(recordStoreExist)
	    {
		RecordStore.deleteRecordStore(AbonneDAO.TABLE_ABONNE);
	    }
	}
	catch (Exception e)
	{
	    //continuer avec l'operation meme si la table n'existe pas et une exception est creee.
	}

	rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	Membre abonne = null;

	for (int i = 0;i < vecAbonneList.size();i++)
	{
	    abonne = (Membre)vecAbonneList.elementAt(i);
	    this.ajouter(abonne);
	}

	this.rsAbonnes.closeRecordStore();
    }

    public Membre getAbonneDetails(int abonneId) throws RecordStoreException, IOException
    {
	Membre abonne = null;
	RecordEnumeration re, ids;
	AbonneRecordFilter abonneRecordFilter = new AbonneRecordFilter();
	abonneRecordFilter.setAbonneId(abonneId);
	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = this.rsAbonnes.enumerateRecords(abonneRecordFilter, null, false);

	if (re.hasNextElement())
	{

	    int idRecord = re.nextRecordId();
	    System.out.println("IdRecord trouvé(abonne details) : " + idRecord);
	    byte[] record = new byte[this.rsAbonnes.getRecordSize(idRecord)];
	    //Récuperer la ligne à partir de la liste du recordStore
	    record = this.rsAbonnes.getRecord(idRecord);
	    Membre courant = new Membre();
	    courant.setIdRecord(idRecord);
	    courant.deSerialize(record);
	    abonne = courant;
	}

	this.rsAbonnes.closeRecordStore();

	return abonne;
    }

    public Membre[] getListAbonnesModifies() throws RecordStoreException, IOException
    {
	//desabonner automatique
	//this.desabonnementAutomatique();

	Membre[] abonneArray = null;
	RecordEnumeration re;

	AbonneRecordFilter abonneRecordFilter = new AbonneRecordFilter();
	abonneRecordFilter.setModified(true);

	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = this.rsAbonnes.enumerateRecords(abonneRecordFilter, null, false);

	abonneArray = new Membre[re.numRecords()];
	int counter = 0;

	while (re.hasNextElement())
	{
	    int idRecord = re.nextRecordId();
	    System.out.println("IdRecord trouvé pour les abonnés modifié: " + idRecord);
	    byte[] record = new byte[this.rsAbonnes.getRecordSize(idRecord)];
	    //Récuperer la ligne à partir de la liste du recordStore
	    record = this.rsAbonnes.getRecord(idRecord);
	    Membre courant = new Membre();
	    courant.setIdRecord(idRecord);

	    courant.deSerialize(record);
	    abonneArray[counter] = courant;
	    counter++;
	}

	//re.destroy();
	rsAbonnes.closeRecordStore();
	return abonneArray;
    }

    /**
     * Declarer un décès
     * @param abonne
     * @throws RecordStoreException
     * @throws IOException
     */
    public void deceder(Membre abonne) throws RecordStoreException, IOException
    {
	int idRecord = -1;

	rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);
	abonne.setModified(true);
	byte[] donnes = abonne.serialize();

	idRecord = this.getIdFromAbonneId(abonne.getIdAbonne());

	this.rsAbonnes.setRecord(idRecord, donnes, 0, donnes.length);
	this.rsAbonnes.closeRecordStore();
    }


//    public void desabonnementAutomatique() throws RecordStoreException, IOException
//    {
//	int idRecord = -1;
//	//Membre abonne = new Membre();
//	Calendar calDateNaissance = Calendar.getInstance();
//	Date dateActuelle = new Date();
//	Calendar calDateActuelle = Calendar.getInstance();
//	calDateActuelle.setTime(dateActuelle);
//	Date dateDesabonnement = new Date();
//	int idCauseDesabonnement = Configuration.CAUSE_DESABONNEMENT_AGE;
//	rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);
//	//abonne.setModified(true);
//	//byte[] donnes = abonne.serialize();
//
//	RecordEnumeration re = this.rsAbonnes.enumerateRecords(null, null, false);
//
//	int i = 0;
//	while (re.hasNextElement())
//	{
//
//	    idRecord = re.nextRecordId();
//	    //idRecord = this.getIdFromAbonneId(abonne.getIdAbonne());
//
//	    //////ADD
//	    byte[] record = new byte[rsAbonnes.getRecordSize(idRecord)];
//	    //Récuperer la ligne à partir de la liste du recordStore
//	    record = rsAbonnes.getRecord(idRecord);
//	    Membre abonne = new Membre();
//	    abonne.setIdRecord(idRecord);
//	    abonne.deSerialize(record);
//
//	    int idRecord2 = this.getIdFromAbonneId(abonne.getIdAbonne());
//
//	    ///END
//
//	    if (abonne.getDateDeNaissance() != null)
//	    {
//		Date datenaissance = abonne.getDateDeNaissance();
//		calDateNaissance.setTime(datenaissance);
//	    }
//
//	    calDateNaissance.set(Calendar.YEAR, calDateNaissance.get(Calendar.YEAR) + 5);
//
//	    if (calDateNaissance.before(calDateActuelle)) //l'enfant a plus que 5 ans
//	    {
//		abonne.setDateDesabonnement(dateDesabonnement);
//		abonne.setIdCauseDesabonnement(idCauseDesabonnement);
//		abonne.setModified(true);
//
//		byte[] donnes = abonne.serialize();
//		this.rsAbonnes.setRecord(idRecord2, donnes, 0, donnes.length);
//		//this.rsAbonnes.setRecord(abonne.getIdRecord(), donnes, 0, donnes.length);
//	    }
//	    i++;
//	}
//	//re.destroy();
//	rsAbonnes.closeRecordStore();
//    }

    /**
     * Avoir la liste de abonné qui sont actifs
     */
    public Membre[] getListAbonnesActif() throws RecordStoreException, IOException
    {

	Membre[] abonneArray = null;
	RecordEnumeration re;

	AbonneRecordFilter abonneRecordFilter = new AbonneRecordFilter();
	abonneRecordFilter.setActif(true);
	
	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);

	re = this.rsAbonnes.enumerateRecords(abonneRecordFilter, null, false);

	abonneArray = new Membre[re.numRecords()];
	int counter = 0;

	while (re.hasNextElement())
	{
	    int idRecord = re.nextRecordId();
	    System.out.println("IdRecord trouvé pour abonné actif : " + idRecord);
	    byte[] record = new byte[this.rsAbonnes.getRecordSize(idRecord)];
	    //Récuperer la ligne à partir de la liste du recordStore
	    record = this.rsAbonnes.getRecord(idRecord);
	    Membre courant = new Membre();
	    courant.setIdRecord(idRecord);

	    courant.deSerialize(record);
	    abonneArray[counter] = courant;
	    counter++;
	}

	//re.destroy();
	rsAbonnes.closeRecordStore();
	return abonneArray;
    }

    public boolean isAbonnesLoaded() throws RecordStoreException {
        System.out.println("AbonneDAO() : existe-t-il un abonné en base ? :");
        boolean loaded=false;
	RecordEnumeration re;
	this.rsAbonnes = RecordStore.openRecordStore(AbonneDAO.TABLE_ABONNE, true);
	re = this.rsAbonnes.enumerateRecords(null, null, false);
        int nbLignes=re.numRecords();
        System.out.println("Nombre d'abonnés qui existent dans la base = "+nbLignes);
	if(nbLignes > 0){
            loaded=true;
        }

	rsAbonnes.closeRecordStore();
        System.out.println("AbonneDAO() : existe-t-il un abonné en base ? :"+loaded);

        return loaded;

    }
}
